package cn.fz.learn02.domain.vo;

import cn.fz.learn02.domain.enums.CodeEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@Schema(description = "统一返回结果")
public class Result <T>{
    /**
     * 请求响应代码，如：0-成功，1-失败
     */
    @Schema(description = "请求响应代码")
    private Integer code; //0代表成功，1代表失败

    /**
     * 接口请求返回业务对象数据
     */
    @Schema(description = "接口请求返回业务对象数据")
    private T data;

    /**
     * 请求返回信息描述或异常信息
     */
    @Schema(description = "请求返回信息描述或异常信息")
    private String message;

    /**
     * 请求成功，对返回结果进行封装
     */
    public static <T>  Result<T>   success(T data){
        return build(CodeEnum.SUCCESS.code, CodeEnum.SUCCESS.message, data);
    }

    /**
     * 请求成功，对返回结果进行封装
     */
    public static <T>  Result<T>   success(){
        return build(CodeEnum.SUCCESS.code, CodeEnum.SUCCESS.message, null);
    }

    /**
     * 请求失败，对返回结果进行封装
     */
    public static <T> Result<T> error(){
        return build(CodeEnum.FAIL.code, CodeEnum.FAIL.message, null);
    }

    /**
     * 请求失败，对返回结果进行封装
     */
    public static <T> Result<T> error(String message){
        return build(CodeEnum.FAIL.code, message, null);
    }

    /**
     * 请求失败，对返回结果进行封装
     */
    public static <T> Result<T> error(String message,T data){
        return build(CodeEnum.FAIL.code, message, data);
    }

    /**
     * 请求失败，对返回结果进行封装
     */
    public static <T> Result<T> error(String message, Integer code){
        return build(code, message, null);
    }

    /**
     * 返回结果统一封装
     */
    private static <T> Result<T> build(Integer code, String message, T data) {
        Result<T> vo = new Result<>();
        vo.setCode(code);
        vo.setMessage(message);
        vo.setData(data);
        return vo;
    }
}
